package com.example.day1;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;

// 函数对象好处2：延迟执行
public class Sample7 {
    static Logger logger = init(Level.DEBUG);

    public static void main(String[] args) {
        /*if (logger.isDebugEnabled()) {
            logger.debug("{}", expensive());
        }*/

        logger.debug("{}", expensive());        // expensive() 立刻执行

        logger.debug("{}", () -> expensive());  // 函数对象使得 expensive 延迟执行
    }

    static String expensive() {
        System.out.println("执行耗时操作...");
        return "日志";
    }

    /**
     * 初始化日志记录器配置
     * 此方法设置日志记录的行为和输出格式，使用提供的日志级别
     * 它创建一个控制台输出的appender，使用模式布局格式化日志条目，并设置为系统输出
     * 最后，它初始化配置并返回一个Logger对象
     *
     * @param level 日志记录的级别，决定了记录的日志信息的门槛
     * @return Logger对象，用于按照初始化的配置记录日志
     */
    static Logger init(Level level) {
        // 创建配置生成器，并设置状态级别和配置名称
        ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder()
                .setStatusLevel(Level.ERROR)
                .setConfigurationName("BuilderTest");

        // 定义控制台输出的appender，设置输出目标为系统输出，并指定输出格式
        AppenderComponentBuilder appender =
                builder.newAppender("Stdout", "CONSOLE")
                        .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT)
                        .add(builder.newLayout("PatternLayout").addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
        // 将 appender 添加到配置中，并设置根日志记录器的级别和appender引用
        builder.add(appender)
                .add(builder.newRootLogger(level).add(builder.newAppenderRef("Stdout")));
        // 初始化配置
        Configurator.initialize(builder.build());
        return LogManager.getLogger();
    }
}
